package componenti.statistica;

public class Erlang implements LeggeDistribuzione {
	/**
	 * 
	 */
	private static final long serialVersionUID = -9214910792843723684L;
	private double tasso;
	private int numeroFunzioni;

	public Erlang(double tasso, int numeroFunzioni) {
		super();
		this.tasso = tasso;
		this.numeroFunzioni = numeroFunzioni;
	}

	@Override
	public double getRealization(double casual) {
		double prodotto = 0;
		for (int i = 0; i < numeroFunzioni; i++) {
			casual = Math.random();
			prodotto *= (1 - casual);
		}
		return (-1.0 / tasso) * Math.log(prodotto);
	}

	public double getTasso() {
		return tasso;
	}

	public void setTasso(double tasso) {
		this.tasso = tasso;
	}

	public int getNumeroFunzioni() {
		return numeroFunzioni;
	}

	public void setNumeroFunzioni(int numeroFunzioni) {
		this.numeroFunzioni = numeroFunzioni;
	}

	@Override
	public double getProbabilita(double realizzazione) {
		double somma = 0;
		for (int i = 0; i < numeroFunzioni; i++) {
			somma += (Math.pow(tasso * realizzazione, i) / fatt(i));
		}
		double exp = Math.exp(-(tasso * realizzazione));
		double prodotto = exp * somma;
		return 1.0 - prodotto;
	}

	private int fatt(int x) {
		int i;
		int f = 1;

		for (i = 1; i <= x; i = i + 1) {
			f = f * i;
		}

		return f;
	}

}
